package com.yc.d0303;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;

@WebServlet("/upload.s")
// 如果不加该注解， 无法处理文件上传请求， 报错：
// Unable to process parts as no multi-part configuration has been provided
@MultipartConfig
public class UploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        // 从请求中获取文件上传对象 Part ， “file” 上传的文件提交的字段名称， 不是文件名
        Part file = req.getPart("myfile");
        file.getContentType(); // 文件类型  image， html， text
        file.getName();  // ==》 字段名 file
        file.getSize();  // 文件大小
        file.getSubmittedFileName(); // 上传的文件名，  Servlet3.1才有这个方法

        //file.write("f:/" + file.getSubmittedFileName()); // 保存文件
        //如何将文件上传到 webapp 下
        // 获取应用上下文对象， 上下文 =》 运行环境
        // jsp 中应用上下文对象 叫 application
        ServletContext application = req.getServletContext();
        // 将 /uploads (web路径) 转换为 磁盘路径
        String realPath = application.getRealPath("/uploads");
        System.out.println("realPath = " + realPath);

        // realPath 的目录不存在， 那么创建文件夹
        new File(realPath).mkdirs();

        file.write(realPath + "/" +file.getSubmittedFileName()); // 保存文件

        // src 的地址怎么写， 假设文件名 a.jpg  => /uploads/a.jpg
        String webpath = "uploads/"+ file.getSubmittedFileName();
        resp.getWriter().append("文件上传成功！<br>");

        if(file.getContentType().contains("image")){
            resp.getWriter().printf("<img src='%s' style='height:200px'>", webpath);
        } else {
            // 普通文档直接提供下载  , download => 默认下载后保存的文件民 => 强制下载
            resp.getWriter().printf("<a href='%s' download='%s'>%s</a>"
                    , webpath
                    , file.getSubmittedFileName()
                    , file.getSubmittedFileName());
        }

        // idea 里面的 uploads 是开发目录下的 uploads
        // 浏览器上传到 uploads 是运行目录下的 uploads

        // 重启服务之后， 运行目录里面多出的文件， 可能会被清除


    }
}
